/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.yurendao.OSFileSystem.data;

import com.yurendao.OSFileSystem.MyFAT.FATStructure;
import com.yurendao.OSFileSystem.MyFAT.MyFAT;
import com.yurendao.OSFileSystem.file.MyFile;
import com.yurendao.OSFileSystem.folder.MyFolder;
import java.util.ArrayList;


/**
 *
 * @author Administrator
 * FIT : FileIndexTable即是 文件索引表
 * 用于 在树形结构和FAT之间的 索引
 */
public class MyFIT {

    private FITStructure myfit ;

    public MyFIT(MyFAT myfat) {
        myfit = new FITStructure();
        myfit.setFileName("MyComputer");
        myfit.setFATNumber(0);
        myfit.setFileType(0);
        myfit.setIshaveChildren(true);
        this.searchMytree(myfat);
    }

    public FITStructure getMyfit() {
        return myfit;
    }

    //利用 递归 构建整棵树
    private void searchMytree(MyFAT myfat){
        this.searchNode(myfat,0,myfit);
    }

    private void searchNode(MyFAT myfat,int parentFATNumber,FITStructure parent){
        if(myfat.getAllfilesOfOneFolder(parentFATNumber).size()<=0){
            parent.setIshaveChildren(false);
        }else{
            parent.setIshaveChildren(true);
            //得到 某结点的所有叶子节点
            ArrayList childrenNodes = myfat.getAllfilesOfOneFolder(parentFATNumber);
            ArrayList<FITStructure> nodes = new ArrayList<FITStructure>();
            //递归的添加某结点的所有叶子节点
            for(int i=0;i<childrenNodes.size();i++){
                FITStructure me = new FITStructure();    //当前的 某个叶子节点
                FATStructure temp = (FATStructure)childrenNodes.get(i);
                if(myfat.isaFolder(temp.getFatType())){
                    me.setFileName(((MyFolder)temp.getFatContent()).getMyfolderAttributes().getFolderName());
                    me.setFileType(1);
                    me.setFATNumber(((MyFolder)temp.getFatContent()).getMyFATNumber());
                    searchNode(myfat,((MyFolder)temp.getFatContent()).getMyFATNumber(),me);
                }else{
                    me.setFileName(((MyFile)temp.getFatContent()).getMyfileAttributes().getFileName());
                    me.setFileType(1);
                    me.setFATNumber(((MyFile)temp.getFatContent()).getMyFATNumber());
                    me.setIshaveChildren(false);
                }
                nodes.add(me);
            }
            parent.setChildrenNodes(nodes);
        }
    }

//    public void showIt(FITStructure parent){
//        ArrayList<FITStructure> nodes = parent.getChildrenNodes();
//        for(int i=0;i<nodes.size();i++){
//            System.out.print(nodes.get(i).getFileName()+"\t");
//            if(nodes.get(i).ishaveChildren()){
//                showIt(nodes.get(i));
//            }
//        }
//        System.out.println("");
//    }

    //得到 某个文件路径 既是某个文件在FAT中的位置
    public int getFATNumber(ArrayList files){
        int number = 0;
        FITStructure temp = myfit;
        ArrayList<FITStructure> nodes;
        String filename = (String) files.get(0);
        if (temp.getFileName().equals(filename)) {
            if (temp.ishaveChildren()) {
                nodes = temp.getChildrenNodes();
                for(int i=1;i<files.size();i++){
                    filename = (String) files.get(i);
                    for(int r = 0;r<nodes.size();r++){
                        temp = nodes.get(r);
                        if(temp.getFileName().equals(filename)){
                            if (temp.ishaveChildren()) {
                                nodes = temp.getChildrenNodes();
                            }
                            break;
                        }
                    }
                }
                number = temp.getFATNumber();
            }
        }
        return number;
    }

    private int getFATNumber2(ArrayList files,int num, FITStructure temp)
    {
        int number = 0;
        if(temp.getFileName().equals(files.get(num).toString())){
            if(num>=files.size())
                number = temp.getFATNumber();
            if(temp.ishaveChildren()){
                ArrayList<FITStructure> nodes;
                nodes = temp.getChildrenNodes();
                for(int i=0;i<nodes.size();i++){
                    getFATNumber2(files,num+1,nodes.get(num));
                }
            }
        }
        return number;
    }
}
